# Завантаження покетів та набору даних
library(tidyverse)
TMDB <- read_csv("U:/Master's_work_Boiko/Data_Analysis_movie/tmdb_movies.csv")
TMDB
# Кількість зміних і спостережень
dim(TMDB)
## [1] 10866    21
# Імена зміних
names(TMDB)
##  [1] "id"                   "imdb_id"              "popularity"          
##  [4] "budget"               "revenue"              "original_title"      
##  [7] "cast"                 "homepage"             "director"            
## [10] "tagline"              "keywords"             "overview"            
## [13] "runtime"              "genres"               "production_companies"
## [16] "release_date"         "vote_count"           "vote_average"        
## [19] "release_year"         "budget_adj"           "revenue_adj"
# Видалення нерелевантних даних
TMDB_cleaned <- TMDB %>% select(-c(id, imdb_id, popularity, budget_adj, revenue_adj, cast, homepage, director, tagline, keywords, overview, production_companies, release_date))
TMDB_cleaned
# Перевірка кількість NA значень у кожній змінній
na_count <- sapply(TMDB_cleaned, function(y) sum(length(which(is.na(y)))))
print(na_count)
##         budget        revenue original_title        runtime         genres 
##              0              0              0              0             23 
##     vote_count   vote_average   release_year 
##              0              0              0
# Видалення рядків, які містять NA значення
TMDB_cleaned <- na.omit(TMDB_cleaned)
print(sum(is.na(TMDB_cleaned)))
## [1] 0
# Перевірка кількість NA значень у кожній змінній
na_count <- sapply(TMDB_cleaned, function(y) sum(length(which(is.na(y)))))
# Перевірка результату
print(na_count)
##         budget        revenue original_title        runtime         genres 
##              0              0              0              0              0 
##     vote_count   vote_average   release_year 
##              0              0              0
# Кількість зміних і спостережень
dim(TMDB_cleaned)
## [1] 10843     8
# Перевірка на кількість 0 значень у кожній змінній
zero_count <- sapply(TMDB_cleaned, function(y) sum(y == 0, na.rm = TRUE))
print(zero_count)
##         budget        revenue original_title        runtime         genres 
##           5674           5993              0             30              0 
##     vote_count   vote_average   release_year 
##              0              0              0
# Видалення рядків, де budget, revenue та runtime дорівнює 0
TMDB_cleaned <- TMDB_cleaned %>%
  filter(budget > 0 & revenue > 0 & runtime > 0)
# Встановлення параметра scipen
options(scipen=999)
# Визначення мінімального значення для змінних budget, revenue та runtime
min_data <- sapply(TMDB_cleaned[, c("runtime", "budget", "revenue")], min, na.rm = TRUE)
min_data 
## runtime  budget revenue 
##      15       1       2
# Кількість зміних і спостережень
dim(TMDB_cleaned)
## [1] 3855    8
# Перевірка на наявність дублікатів
original_nrow <- nrow(TMDB_cleaned)
duplicated_rows <- TMDB_cleaned[duplicated(TMDB_cleaned),]

# Якщо є дублікати, вивести їх кількість
if(nrow(duplicated_rows) > 0) {
  print(paste("Number of duplicated rows: ", nrow(duplicated_rows)))
}
## [1] "Number of duplicated rows:  1"
# Видалення дублікатів
TMDB_cleaned <- distinct(TMDB_cleaned)

# Перевірка результату
new_nrow <- nrow(TMDB_cleaned)
print(paste("Кількість рядків до видалення дублікатів: ", original_nrow))
## [1] "Кількість рядків до видалення дублікатів:  3855"
print(paste("Кількість рядків після видалення дублікатів: ", new_nrow))
## [1] "Кількість рядків після видалення дублікатів:  3854"
# Встановлення порогового значення
revenue_threshold <- 11000
budget_threshold <- 1000

# Відфільтровування фільмів з касовими зборами та бюджетом нижче порогового значення
TMDB_cleaned <- TMDB_cleaned %>%
  filter(revenue > revenue_threshold & budget > budget_threshold)

# Перевірка результату
summary(TMDB_cleaned$budget )
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##      7000  10000000  25000000  37609526  50000000 425000000
summary(TMDB_cleaned$revenue )
##       Min.    1st Qu.     Median       Mean    3rd Qu.       Max. 
##      13308   14460000   46236000  109155433  126216940 2781505847
# Фільтрування фільмів з касовими зборами менше за 20000 тисяч
low_revenue_movies <- TMDB_cleaned %>%
  filter(revenue > 20000)

# Виведення перших рядків цього списка для перевірки
low_revenue_movies
# Виведення структури DataFrame, що включає імена та типи змінних, а також перші кілька значень кожної змінної
str(TMDB_cleaned)
## tibble [3,801 × 8] (S3: tbl_df/tbl/data.frame)
##  $ budget        : num [1:3801] 150000000 150000000 110000000 200000000 190000000 135000000 155000000 108000000 74000000 175000000 ...
##  $ revenue       : num [1:3801] 1513528810 378436354 295238201 2068178225 1506249360 ...
##  $ original_title: chr [1:3801] "Jurassic World" "Mad Max: Fury Road" "Insurgent" "Star Wars: The Force Awakens" ...
##  $ runtime       : num [1:3801] 124 120 119 136 137 156 125 141 91 94 ...
##  $ genres        : chr [1:3801] "Action|Adventure|Science Fiction|Thriller" "Action|Adventure|Science Fiction|Thriller" "Adventure|Science Fiction|Thriller" "Action|Adventure|Science Fiction|Fantasy" ...
##  $ vote_count    : num [1:3801] 5562 6185 2480 5292 2947 ...
##  $ vote_average  : num [1:3801] 6.5 7.1 6.3 7.5 7.3 7.2 5.8 7.6 6.5 8 ...
##  $ release_year  : num [1:3801] 2015 2015 2015 2015 2015 ...
##  - attr(*, "na.action")= 'omit' Named int [1:23] 425 621 998 1713 1898 2371 2377 2854 3280 4548 ...
##   ..- attr(*, "names")= chr [1:23] "425" "621" "998" "1713" ...
# Перевірка розміру DataFrame
print(paste("Кількість рядків: ", nrow(TMDB_cleaned)))
## [1] "Кількість рядків:  3801"
print(paste("Кількість стовбців: ", ncol(TMDB_cleaned)))
## [1] "Кількість стовбців:  8"
# Перевірка загальних статистичних характеристик змінних
summary(TMDB_cleaned)
##      budget             revenue           original_title        runtime     
##  Min.   :     7000   Min.   :     13308   Length:3801        Min.   : 26.0  
##  1st Qu.: 10000000   1st Qu.:  14460000   Class :character   1st Qu.: 96.0  
##  Median : 25000000   Median :  46236000   Mode  :character   Median :106.0  
##  Mean   : 37609526   Mean   : 109155433                      Mean   :109.4  
##  3rd Qu.: 50000000   3rd Qu.: 126216940                      3rd Qu.:119.0  
##  Max.   :425000000   Max.   :2781505847                      Max.   :338.0  
##     genres            vote_count      vote_average    release_year 
##  Length:3801        Min.   :  10.0   Min.   :2.200   Min.   :1960  
##  Class :character   1st Qu.:  73.0   1st Qu.:5.700   1st Qu.:1995  
##  Mode  :character   Median : 207.0   Median :6.200   Median :2004  
##                     Mean   : 533.8   Mean   :6.174   Mean   :2001  
##                     3rd Qu.: 584.0   3rd Qu.:6.700   3rd Qu.:2010  
##                     Max.   :9767.0   Max.   :8.400   Max.   :2015
# Перевірка перших та останніх рядків DataFrame
head(TMDB_cleaned)
tail(TMDB_cleaned)
# Розподіл рейтингу фільму (vote_average)
ggplot(TMDB_cleaned, aes(x=vote_average)) + 
  geom_histogram(binwidth=0.5, fill="blue", color="black", alpha=0.7) + 
  labs(title="Розподіл рейтингу фільмів", x="Рейтинг", y="Кількість фільмів")

library(patchwork)
## Warning: пакет 'patchwork' был собран под R версии 4.3.2
library(scales) # Для dollar_format
## 
## Присоединяю пакет: 'scales'
## Следующий объект скрыт от 'package:purrr':
## 
##     discard
## Следующий объект скрыт от 'package:readr':
## 
##     col_factor
# Графік бюджету з коригуванням осі X
p1 <- ggplot(TMDB_cleaned, aes(x=budget)) + 
  geom_histogram(bins=30, fill="blue") + 
  scale_x_continuous(labels = dollar_format(prefix = "$", suffix = "", big.mark = ",")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + # Нахил тексту
  ggtitle("Бюджет") +
  xlab("Бюджет (в доларах)")

# Графік доходу з коригуванням осі X
p2 <- ggplot(TMDB_cleaned, aes(x=revenue)) + 
  geom_histogram(bins=30, fill="green") + 
  scale_x_continuous(labels = dollar_format(prefix = "$", suffix = "", big.mark = ",")) +
  theme_minimal() +
  theme(axis.text.x = element_text(angle = 45, hjust = 1)) + # Нахил тексту
  ggtitle("Дохід") +
  xlab("Дохід (в доларах)")

p3 <- ggplot(TMDB_cleaned, aes(x=runtime)) + 
  geom_histogram(bins=30, fill="red") + 
  theme_minimal() + 
  ggtitle("Тривалість") +
  xlab("Тривалість (у хвилинах)")

# Графік середнього рейтингу
p4 <- ggplot(TMDB_cleaned, aes(x=vote_average)) + 
  geom_histogram(bins=30, fill="orange") + 
  theme_minimal() + 
  ggtitle("Середній Рейтинг")

# Графік року випуску
p5 <- ggplot(TMDB_cleaned, aes(x=release_year)) + 
  geom_histogram(bins=30, fill="purple") + 
  theme_minimal() + 
  ggtitle("Рік Випуску")

# Графік кількості голосів
p6 <- ggplot(TMDB_cleaned, aes(x=vote_count)) + 
  geom_histogram(bins=30, fill="yellow") + 
  theme_minimal() + 
  ggtitle("Кількість Голосів")


# Об'єднання графіків за допомогою patchwork
layout <- (p1 + p2) / (p3 + p4) / (p5 + p6)
layout

ggplot(TMDB_cleaned, aes(x=revenue)) +
  geom_density(fill="blue", color="black", alpha=0.7) +
  theme_minimal() +
  labs(title="Розподіл касових зборів", x="Касові збори", y="Щільність")

# Розділяємо жанри на різні рядки
data_expanded <- TMDB_cleaned %>%
  separate_rows(genres, sep = "\\|")
# Перетворення жанрів на бінарні змінні (dummy variables)
data_dummies <- data_expanded %>%
  pivot_wider(names_from = genres, values_from = genres, values_fill = list(genres = "Absent")) %>%
  mutate(across(-c(original_title, runtime, vote_count, vote_average, release_year, budget, revenue), ~ifelse(. == "Absent", 0, 1)))
# Перевірка перших та останніх рядків DataFrame
data_dummies <- data_dummies %>% rename(TV_Movie = `TV Movie`)
data_dummies <- data_dummies %>% rename(Science_Fiction = `Science Fiction`)
head(data_dummies)
# Описова статистика
summary(data_dummies)
##      budget             revenue           original_title        runtime     
##  Min.   :     7000   Min.   :     13308   Length:3801        Min.   : 26.0  
##  1st Qu.: 10000000   1st Qu.:  14460000   Class :character   1st Qu.: 96.0  
##  Median : 25000000   Median :  46236000   Mode  :character   Median :106.0  
##  Mean   : 37609526   Mean   : 109155433                      Mean   :109.4  
##  3rd Qu.: 50000000   3rd Qu.: 126216940                      3rd Qu.:119.0  
##  Max.   :425000000   Max.   :2781505847                      Max.   :338.0  
##    vote_count      vote_average    release_year      Action     
##  Min.   :  10.0   Min.   :2.200   Min.   :1960   Min.   :0.000  
##  1st Qu.:  73.0   1st Qu.:5.700   1st Qu.:1995   1st Qu.:0.000  
##  Median : 207.0   Median :6.200   Median :2004   Median :0.000  
##  Mean   : 533.8   Mean   :6.174   Mean   :2001   Mean   :0.282  
##  3rd Qu.: 584.0   3rd Qu.:6.700   3rd Qu.:2010   3rd Qu.:1.000  
##  Max.   :9767.0   Max.   :8.400   Max.   :2015   Max.   :1.000  
##    Adventure      Science_Fiction     Thriller        Fantasy      
##  Min.   :0.0000   Min.   :0.0000   Min.   :0.000   Min.   :0.0000  
##  1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.000   1st Qu.:0.0000  
##  Median :0.0000   Median :0.0000   Median :0.000   Median :0.0000  
##  Mean   :0.1949   Mean   :0.1355   Mean   :0.312   Mean   :0.1023  
##  3rd Qu.:0.0000   3rd Qu.:0.0000   3rd Qu.:1.000   3rd Qu.:0.0000  
##  Max.   :1.0000   Max.   :1.0000   Max.   :1.000   Max.   :1.0000  
##      Crime         Western            Drama            Family      
##  Min.   :0.00   Min.   :0.00000   Min.   :0.0000   Min.   :0.0000  
##  1st Qu.:0.00   1st Qu.:0.00000   1st Qu.:0.0000   1st Qu.:0.0000  
##  Median :0.00   Median :0.00000   Median :0.0000   Median :0.0000  
##  Mean   :0.17   Mean   :0.01342   Mean   :0.4567   Mean   :0.1102  
##  3rd Qu.:0.00   3rd Qu.:0.00000   3rd Qu.:1.0000   3rd Qu.:0.0000  
##  Max.   :1.00   Max.   :1.00000   Max.   :1.0000   Max.   :1.0000  
##    Animation           Comedy          Mystery           Romance      
##  Min.   :0.00000   Min.   :0.0000   Min.   :0.00000   Min.   :0.0000  
##  1st Qu.:0.00000   1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.:0.0000  
##  Median :0.00000   Median :0.0000   Median :0.00000   Median :0.0000  
##  Mean   :0.05235   Mean   :0.3517   Mean   :0.08971   Mean   :0.1721  
##  3rd Qu.:0.00000   3rd Qu.:1.0000   3rd Qu.:0.00000   3rd Qu.:0.0000  
##  Max.   :1.00000   Max.   :1.0000   Max.   :1.00000   Max.   :1.0000  
##       War             History            Music             Horror      
##  Min.   :0.00000   Min.   :0.00000   Min.   :0.00000   Min.   :0.0000  
##  1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.0000  
##  Median :0.00000   Median :0.00000   Median :0.00000   Median :0.0000  
##  Mean   :0.03131   Mean   :0.03368   Mean   :0.03499   Mean   :0.1194  
##  3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.0000  
##  Max.   :1.00000   Max.   :1.00000   Max.   :1.00000   Max.   :1.0000  
##   Documentary          Foreign           TV_Movie        
##  Min.   :0.000000   Min.   :0.00000   Min.   :0.0000000  
##  1st Qu.:0.000000   1st Qu.:0.00000   1st Qu.:0.0000000  
##  Median :0.000000   Median :0.00000   Median :0.0000000  
##  Mean   :0.008945   Mean   :0.00342   Mean   :0.0002631  
##  3rd Qu.:0.000000   3rd Qu.:0.00000   3rd Qu.:0.0000000  
##  Max.   :1.000000   Max.   :1.00000   Max.   :1.0000000
#завантаження пакету ggcorrplot

library(ggcorrplot)
## Warning: пакет 'ggcorrplot' был собран под R версии 4.3.2
# Кореляційний аналіз
data_numbers <- TMDB_cleaned %>% select(-c(original_title, genres))
correlation_matrix <- cor(data_numbers)
# Візуалізація кореляційної матриці
ggcorrplot(correlation_matrix, lab = TRUE,title ='Correlation Matrix of Movie Variables', lab_size = 3)

# Кореляційний аналіз
data_num <- data_dummies %>% select(-c(original_title, runtime, vote_count, release_year, budget, Adventure, Thriller, Fantasy, Crime, Western, Family, Comedy, Mystery, Romance, Music,   Foreign, TV_Movie))
correlation_mat <- cor(data_num)

# Візуалізація кореляційної матриці
ggcorrplot(correlation_mat, lab = TRUE,title ='Correlation Matrix of Movie Variables', lab_size = 3)

# Побудова графіку Бюджет vs Доходи
ggplot(TMDB_cleaned, aes(x = budget, y = revenue)) +
    geom_point(aes(color = vote_average), alpha = 0.6) +  # Додавання кольору залежно від рейтингу
    geom_smooth(method = "lm", se = FALSE, color = "blue") +  # Лінія регресії
    scale_x_continuous(labels = scales::comma) +  # Форматування осі X
    scale_y_continuous(labels = scales::comma) +  # Форматування осі Y
    labs(title = "Бюджет vs Касові збори", x = "Бюджет (у доларах)", y = "Касові збори (у доларах)") +
    theme_minimal() +  # Застосування теми
    theme(legend.position = "bottom")  # Розміщення легенди
## `geom_smooth()` using formula = 'y ~ x'

# Побудова графіку Кількість голосів vs Доходи
ggplot(TMDB_cleaned, aes(x = vote_count, y = revenue)) +
    geom_point(alpha = 0.5) + # використання прозорості для кращого візуального представлення
    geom_smooth(method = "lm", se = FALSE, color = "blue") +  # Лінія регресії
    scale_x_continuous(labels = scales::comma) +  # Форматування осі X
    scale_y_continuous(labels = scales::comma) +  # Форматування осі Y
    theme_minimal() +  # Застосування теми
    labs(title = "Кількість голосів vs Касові збори", x = "Кількість голосів", y = "Касові збори")
## `geom_smooth()` using formula = 'y ~ x'

# Створення графіка
ggplot(TMDB_cleaned, aes(x = vote_count, y = vote_average)) +
    geom_point(alpha = 0.5) + # використання прозорості для кращого відображення даних
    geom_smooth(method = "lm", se = FALSE, color = "blue") +  # Лінія регресії
    theme_minimal() +
    labs(title = "Кількість Голосів vs Рейтинг",
         x = "Кількість Голосів",
         y = "Рейтинг")
## `geom_smooth()` using formula = 'y ~ x'

genres_data <- data_dummies %>% 
  gather(key=genre, value=value, -original_title, -runtime, -vote_count, -vote_average, -release_year, -budget, -revenue, -Foreign, -TV_Movie) %>% 
  filter(value == 1)

genre_rating <- genres_data %>%
  group_by(genre) %>%
  summarise(avg_rating = mean(vote_average))

ggplot(genre_rating, aes(x=genre, y=avg_rating)) + 
  geom_bar(stat="identity", fill="purple") + 
  coord_flip() +
  labs(title="Середній рейтинг за жанром", x="Жанр", y="Середній рейтинг")

genres_data <- data_dummies %>% 
  gather(key=genre, value=value, -original_title, -runtime, -vote_count, -vote_average, -release_year, -budget, -revenue, -Foreign, -TV_Movie) %>% 
  filter(value == 1)

genre_rating <- genres_data %>%
  group_by(genre) %>%
  summarise(avg_revenue = mean(revenue))

ggplot(genre_rating, aes(x=genre, y=avg_revenue)) + 
  geom_bar(stat="identity", fill="purple") + 
  coord_flip() +
  labs(title="Середній дохід за жанром", x="Жанр", y="Середній дохід")

# Підготовка даних: зміна структури даних з широкої на довгу
long_data <- data_dummies %>%
  pivot_longer(
    cols = c(Action, Animation, Science_Fiction, Adventure, Comedy, Documentary, Drama, Thriller, Fantasy, History, Horror, Crime, Western, War, Family, Mystery, Romance, Music), # Замініть на назви ваших жанрових колонок
    names_to = "Genre",
    values_to = "Genre_Present"
  ) %>%
  filter(Genre_Present == 1)

# Розрахунок середнього чистого доходу за жанрами
average_net_revenue_by_genre <- long_data %>%
  group_by(Genre) %>%
  summarize(
    Average_Net_Revenue = mean(revenue - budget, na.rm = TRUE)
  )

# Візуалізація
ggplot(average_net_revenue_by_genre, aes(x = Genre, y = Average_Net_Revenue)) +
  geom_bar(stat = "identity", fill = "steelblue") +
  theme_minimal() +
  coord_flip() + # Для горизонтального бар-графіка
  labs(title = "Середній чистий дохід фільмів за жанрами",
       x = "Жанр",
       y = "Середній чистий дохід (у доларах)")

genre_count <- genres_data %>%
  group_by(genre) %>%
  count()

ggplot(genre_count, aes(x=genre, y=n)) + 
  geom_bar(stat="identity", fill="cyan") + 
  coord_flip() +
  labs(title="Кількість фільмів за жанром", x="Жанр", y="Кількість фільмів")

# Групування даних по року випуску та обчислення середніх значень касових зборів і середнього рейтингу
trends <- aggregate(data_dummies[c('revenue', 'vote_average')], by=list(data_dummies$release_year), FUN=mean)
colnames(trends) <- c('release_year', 'avg_revenue', 'avg_vote_average')

# Побудова графіку для касових зборів
g1 <- ggplot(trends, aes(x=release_year, y=avg_revenue)) +
  geom_line() +
  labs(title="Average Revenue Over Years", x="Release Year", y="Average Revenue")

# Побудова графіку для середнього рейтингу
g2 <- ggplot(trends, aes(x=release_year, y=avg_vote_average)) +
  geom_line() +
  labs(title="Average Vote Average Over Years", x="Release Year", y="Average Vote Average")

# Об'єднання графіків за допомогою patchwork
layout <- (g1 / g2)
layout

# Функція для виявлення викидів за допомогою міжквартильного розмаху (IQR)
detect_outliers <- function(df, feature) {
  Q1 <- quantile(df[[feature]], 0.25)
  Q3 <- quantile(df[[feature]], 0.75)
  IQR <- Q3 - Q1
  lower_bound <- Q1 - 1.5 * IQR
  upper_bound <- Q3 + 1.5 * IQR
  
  return(which(df[[feature]] < lower_bound | df[[feature]] > upper_bound))
}

# Виявлення викидів для бюджету, касових зборів, тривалості та кількості голосів
outliers_budget <- detect_outliers(data_dummies, 'budget')
outliers_revenue <- detect_outliers(data_dummies, 'revenue')
outliers_runtime <- detect_outliers(data_dummies, 'runtime')
outliers_vote_count <- detect_outliers(data_dummies, 'vote_count')

# Об'єднання всіх індексів викидів
all_outliers <- c(outliers_budget, outliers_revenue, outliers_runtime, outliers_vote_count)

# Видалення викидів з датасету
movies_data_clean <- data_dummies[-unique(all_outliers), ]

# Перегляд оновлених статистик
summary(movies_data_clean)
##      budget             revenue          original_title        runtime     
##  Min.   :     7000   Min.   :    13308   Length:3146        Min.   : 62.0  
##  1st Qu.:  8000000   1st Qu.: 11221339   Class :character   1st Qu.: 95.0  
##  Median : 20000000   Median : 34541399   Mode  :character   Median :104.0  
##  Mean   : 26568312   Mean   : 57426836                      Mean   :105.9  
##  3rd Qu.: 39000000   3rd Qu.: 84636631                      3rd Qu.:115.0  
##  Max.   :110000000   Max.   :289317794                      Max.   :153.0  
##    vote_count      vote_average    release_year      Action      
##  Min.   :  10.0   Min.   :2.200   Min.   :1960   Min.   :0.0000  
##  1st Qu.:  60.0   1st Qu.:5.600   1st Qu.:1995   1st Qu.:0.0000  
##  Median : 159.0   Median :6.100   Median :2004   Median :0.0000  
##  Mean   : 265.1   Mean   :6.071   Mean   :2001   Mean   :0.2432  
##  3rd Qu.: 368.0   3rd Qu.:6.600   3rd Qu.:2009   3rd Qu.:0.0000  
##  Max.   :1350.0   Max.   :8.400   Max.   :2015   Max.   :1.0000  
##    Adventure     Science_Fiction     Thriller         Fantasy       
##  Min.   :0.000   Min.   :0.0000   Min.   :0.0000   Min.   :0.00000  
##  1st Qu.:0.000   1st Qu.:0.0000   1st Qu.:0.0000   1st Qu.:0.00000  
##  Median :0.000   Median :0.0000   Median :0.0000   Median :0.00000  
##  Mean   :0.151   Mean   :0.1163   Mean   :0.3153   Mean   :0.08233  
##  3rd Qu.:0.000   3rd Qu.:0.0000   3rd Qu.:1.0000   3rd Qu.:0.00000  
##  Max.   :1.000   Max.   :1.0000   Max.   :1.0000   Max.   :1.00000  
##      Crime           Western            Drama            Family       
##  Min.   :0.0000   Min.   :0.00000   Min.   :0.0000   Min.   :0.00000  
##  1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.:0.0000   1st Qu.:0.00000  
##  Median :0.0000   Median :0.00000   Median :0.0000   Median :0.00000  
##  Mean   :0.1751   Mean   :0.01208   Mean   :0.4739   Mean   :0.09282  
##  3rd Qu.:0.0000   3rd Qu.:0.00000   3rd Qu.:1.0000   3rd Qu.:0.00000  
##  Max.   :1.0000   Max.   :1.00000   Max.   :1.0000   Max.   :1.00000  
##    Animation           Comedy          Mystery           Romance     
##  Min.   :0.00000   Min.   :0.0000   Min.   :0.00000   Min.   :0.000  
##  1st Qu.:0.00000   1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.:0.000  
##  Median :0.00000   Median :0.0000   Median :0.00000   Median :0.000  
##  Mean   :0.03592   Mean   :0.3748   Mean   :0.09313   Mean   :0.185  
##  3rd Qu.:0.00000   3rd Qu.:1.0000   3rd Qu.:0.00000   3rd Qu.:0.000  
##  Max.   :1.00000   Max.   :1.0000   Max.   :1.00000   Max.   :1.000  
##       War            History            Music             Horror     
##  Min.   :0.0000   Min.   :0.00000   Min.   :0.00000   Min.   :0.000  
##  1st Qu.:0.0000   1st Qu.:0.00000   1st Qu.:0.00000   1st Qu.:0.000  
##  Median :0.0000   Median :0.00000   Median :0.00000   Median :0.000  
##  Mean   :0.0267   Mean   :0.02511   Mean   :0.03751   Mean   :0.137  
##  3rd Qu.:0.0000   3rd Qu.:0.00000   3rd Qu.:0.00000   3rd Qu.:0.000  
##  Max.   :1.0000   Max.   :1.00000   Max.   :1.00000   Max.   :1.000  
##   Documentary         Foreign            TV_Movie        
##  Min.   :0.00000   Min.   :0.000000   Min.   :0.0000000  
##  1st Qu.:0.00000   1st Qu.:0.000000   1st Qu.:0.0000000  
##  Median :0.00000   Median :0.000000   Median :0.0000000  
##  Mean   :0.01049   Mean   :0.003179   Mean   :0.0003179  
##  3rd Qu.:0.00000   3rd Qu.:0.000000   3rd Qu.:0.0000000  
##  Max.   :1.00000   Max.   :1.000000   Max.   :1.0000000
# Вибір змінних для моделі
predictors <- c("budget", "runtime", "vote_count", "release_year")

# Підготовка даних для моделі касових зборів
X_revenue <- data_dummies %>% select(all_of(predictors))
y_revenue <- data_dummies$revenue

# Розбиття даних на тренувальні та тестові набори
set.seed(42)
train_index <- sample(1:nrow(X_revenue), 0.7 * nrow(X_revenue))
X_train_rev <- X_revenue[train_index, ]
y_train_rev <- y_revenue[train_index]
X_test_rev <- X_revenue[-train_index, ]
y_test_rev <- y_revenue[-train_index]

# Побудова моделі лінійної регресії
model_revenue <- lm(y_train_rev ~ ., data = X_train_rev)
summary(model_revenue)
## 
## Call:
## lm(formula = y_train_rev ~ ., data = X_train_rev)
## 
## Residuals:
##        Min         1Q     Median         3Q        Max 
## -685746685  -34163378   -7313334   19570384 1220676130 
## 
## Coefficients:
##                      Estimate       Std. Error t value             Pr(>|t|)    
## (Intercept)  2532800569.07497  362102218.37767   6.995     0.00000000000335 ***
## budget                1.66927          0.05524  30.218 < 0.0000000000000002 ***
## runtime         -134044.05519     102527.27534  -1.307                0.191    
## vote_count       102988.98671       2602.64007  39.571 < 0.0000000000000002 ***
## release_year   -1263493.84561     179951.31010  -7.021     0.00000000000278 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 98230000 on 2655 degrees of freedom
## Multiple R-squared:  0.6723, Adjusted R-squared:  0.6718 
## F-statistic:  1362 on 4 and 2655 DF,  p-value: < 0.00000000000000022
# Прогнозування та оцінка моделі
predictions_rev <- predict(model_revenue, X_test_rev)
MSE_revenue <- mean((predictions_rev - y_test_rev)^2)
R2_revenue <- summary(model_revenue)$r.squared

# Виведення результатів
cat("MSE for Revenue Model: ", MSE_revenue, "\n")
## MSE for Revenue Model:  11286474709387372
cat("R2 for Revenue Model: ", R2_revenue, "\n")
## R2 for Revenue Model:  0.672293
# Вибір змінних для моделі
predictors <- c("budget", "runtime", "vote_count", "release_year")
# Підготовка даних для моделі середнього рейтингу голосування
X_vote <- data_dummies %>% select(all_of(predictors))
y_vote <- data_dummies$vote_average

# Розбиття даних на тренувальні та тестові набори
set.seed(42)
train_index_vote <- sample(1:nrow(X_vote), 0.7 * nrow(X_vote))
X_train_vote <- X_vote[train_index_vote, ]
y_train_vote <- y_vote[train_index_vote]
X_test_vote <- X_vote[-train_index_vote, ]
y_test_vote <- y_vote[-train_index_vote]

# Побудова моделі лінійної регресії
model_vote <- lm(y_train_vote ~ ., data = X_train_vote)
summary(model_vote)
## 
## Call:
## lm(formula = y_train_vote ~ ., data = X_train_vote)
## 
## Residuals:
##     Min      1Q  Median      3Q     Max 
## -3.2728 -0.4093  0.0443  0.4608  2.6066 
## 
## Coefficients:
##                      Estimate       Std. Error t value             Pr(>|t|)    
## (Intercept)  23.4133389947190  2.4662196675545   9.494 < 0.0000000000000002 ***
## budget       -0.0000000051640  0.0000000003762 -13.725 < 0.0000000000000002 ***
## runtime       0.0103005395210  0.0006982966965  14.751 < 0.0000000000000002 ***
## vote_count    0.0004419436921  0.0000177261607  24.932 < 0.0000000000000002 ***
## release_year -0.0091979895107  0.0012256192800  -7.505   0.0000000000000835 ***
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 0.669 on 2655 degrees of freedom
## Multiple R-squared:  0.291,  Adjusted R-squared:   0.29 
## F-statistic: 272.5 on 4 and 2655 DF,  p-value: < 0.00000000000000022
# Прогнозування та оцінка моделі
predictions_vote <- predict(model_vote, X_test_vote)
MSE_vote <- mean((predictions_vote - y_test_vote)^2)
R2_vote <- summary(model_vote)$r.squared

# Виведення результатів
cat("MSE for Vote Average Model: ", MSE_vote, "\n")
## MSE for Vote Average Model:  0.4086104
cat("R2 for Vote Average Model: ", R2_vote, "\n")
## R2 for Vote Average Model:  0.2910204
library(randomForest)
## Warning: пакет 'randomForest' был собран под R версии 4.3.2
## randomForest 4.7-1.1
## Type rfNews() to see new features/changes/bug fixes.
## 
## Присоединяю пакет: 'randomForest'
## Следующий объект скрыт от 'package:dplyr':
## 
##     combine
## Следующий объект скрыт от 'package:ggplot2':
## 
##     margin
# Підготовка даних для аналізу касових зборів
# Видаляємо непотрібні стовпці
movies_for_revenue <- data_dummies[, !(names(data_dummies) %in% c('Unnamed: 0', 'original_title', 'revenue', 'TV_Movie', 'Foreign'))]

# Визначаємо змінну для прогнозування
revenue <- data_dummies$revenue

# Розділяємо дані на навчальний та тестовий набори (70% на 30%)
set.seed(42) # для відтворюваності результатів
train_indices <- sample(1:nrow(movies_for_revenue), 0.7*nrow(movies_for_revenue))
train_data_revenue <- movies_for_revenue[train_indices, ]
train_revenue <- revenue[train_indices]

test_data_revenue <- movies_for_revenue[-train_indices, ]
test_revenue <- revenue[-train_indices]

# Створення моделі випадкового лісу для касових зборів
rf_revenue <- randomForest(x = train_data_revenue, y = train_revenue, ntree = 100, importance = TRUE)

# Оцінка моделі
revenue_pred <- predict(rf_revenue, test_data_revenue)
revenue_rsquare <- cor(test_revenue, revenue_pred)^2

# Виведення результату
print(paste('R-squared for revenue model:', revenue_rsquare))
## [1] "R-squared for revenue model: 0.761066926674026"
# Перетворюємо дані важливості змінних у data frame
importance_revenue <- importance(rf_revenue, type = 1) # type 1 для %IncMSE
importance_revenue_df <- data.frame(Feature = rownames(importance_revenue), 
                                    Importance = importance_revenue[, 1])

# Відсортуємо змінні за зменшенням важливості
importance_revenue_df <- importance_revenue_df[order(importance_revenue_df$Importance, decreasing = TRUE), ]

# Створимо графік важливості змінних для касових зборів
ggplot(importance_revenue_df, aes(x = reorder(Feature, Importance), y = Importance)) +
  geom_bar(stat = 'identity') +
  coord_flip() + # Перевертаємо графік для кращого відображення
  xlab('') + 
  ylab('% Increase in MSE') + 
  ggtitle('Feature Importance for Revenue Model') +
  theme_minimal()

# Аналогічно для аналізу рейтингу фільму
movies_for_rating <- data_dummies[, !(names(data_dummies) %in% c('Unnamed: 0', 'original_title', 'vote_average', 'TV_Movie', 'Foreign'))]
rating <- data_dummies$vote_average

# Розділяємо дані
set.seed(42) # для відтворюваності результатів
train_data_rating <- movies_for_rating[train_indices, ]
train_rating <- rating[train_indices]

test_data_rating <- movies_for_rating[-train_indices, ]
test_rating <- rating[-train_indices]

# Створення моделі випадкового лісу для рейтингу
rf_rating <- randomForest(x = train_data_rating, y = train_rating, ntree = 100, importance = TRUE)

# Оцінка моделі
rating_pred <- predict(rf_rating, test_data_rating)
rating_rsquare <- cor(test_rating, rating_pred)^2

# Виведення результату
print(paste('R-squared for rating model:', rating_rsquare))
## [1] "R-squared for rating model: 0.54512342336686"
# Важливість змінних
importance_rating <- importance(rf_rating)

# Перетворюємо дані важливості змінних у data frame
importance_rating_df <- data.frame(Feature=rownames(importance_rating), 
                                    Importance=importance_rating[,'%IncMSE'])

# Відсортуємо змінні за зменшенням важливості
importance_rating_df <- importance_rating_df[order(-importance_rating_df$Importance), ]

# Створимо графік важливості змінних для рейтингу
ggplot(importance_rating_df, aes(x=reorder(Feature, Importance), y=Importance)) +
  geom_bar(stat='identity') +
  coord_flip() + # Перевертаємо графік для кращого відображення
  xlab('') + 
  ylab('% Increase in MSE') + 
  ggtitle('Feature Importance for Rating Model') +
  theme_minimal()